AWS Elemental MediaStoreをAWS CLIで操作してみた 〜リリース後に追加されたContainer操作系コマンド編〜
はじめに
清水です。メディア向けに最適化されたストレージサービスであるAWS Elemental MediaStore、リリースされたのは2017年11月末でした。re:Invent 2017期間中に発表されたメディア向けサービスのひとつということで胸躍らせていた私は、リリースから1月ちょっと経た段階でMediaStoreのAWS CLIコマンドをひととおり試し、以下2本のブログエントリにまとめていました。
- AWS Elemental MediaStoreをAWS CLIで操作してみた 〜Container操作系コマンド編〜 | DevelopersIO
- AWS Elemental MediaStoreをAWS CLIで操作してみた 〜Object操作系コマンド編〜 | DevelopersIO
そして先日、MediaStoreのタグベースのアクセスコントロールを試してみた際、Container操作系のコマンドについてはタグ操作含め、上記のブログエントリにまとめたリリース当時からだいぶ増えていることに気がつきました。リリースから早3年、機能アップデート自体もたくさんありましたが、それに伴ってAPI(AWS CLIコマンド)も種類が増えていますね。(なお、Object操作系のコマンドについてはAPIやコマンド自体の増加はありませんでした。)
リリースの段階ですべてのコマンドを網羅できていたのだから、コマンドが増えた現在も改めてすべてのコマンドを試しておきたい、ということで、本エントリではMediaStoreのAWS CLIコンテナ操作系コマンドについて、リリース以降から増えたものをまとめてみます。またあわせて、それらのコマンドで設定する機能がいつ頃リリースされたのか、といったMediaStoreのアップデート履歴についても簡単ですがまとめてみたいと思います。題して、「AWS Elemental MediaStoreをAWS CLIで操作してみた」シリーズ、3年越しの第3弾「リリース後に追加されたContainer操作系コマンド編」です。
MediaStoreのリリース当時から増えたコマンドを確認してみる
まずはmediastoreコマンドで、リリース当時から増えたものを確認していきたいと思います。リリース当時にまとめたエントリ(AWS Elemental MediaStoreをAWS CLIで操作してみた 〜Container操作系コマンド編〜 | DevelopersIO)では、以下の7つを扱っていました。
- create-container
- delete-container
- delete-container-policy
- describe-container
- get-container-policy
- list-containers
- put-container-policy
(2021/06/28)現時点で、AWS CLI Command Referenceを参照すると、以下21個が列挙されています。
- create-container
- delete-container
- delete-container-policy
- delete-cors-policy
- delete-lifecycle-policy
- delete-metric-policy
- describe-container
- get-container-policy
- get-cors-policy
- get-lifecycle-policy
- get-metric-policy
- list-containers
- list-tags-for-resource
- put-container-policy
- put-cors-policy
- put-lifecycle-policy
- put-metric-policy
- start-access-logging
- stop-access-logging
- tag-resource
- untag-resource
AWS Elemental MediaStoreのリリースから早3年半、APIの数も3倍になりました。機能ごとに整理すると以下、14個がリリース後に増えたmediastoreコマンド(= MediaStoreのAPI)となります。
- CORSポリシー操作
- get-cors-policy
- put-cors-policy
- delete-cors-policy
- ライフサイクルポリシー操作
- get-lifecycle-policy
- put-lifecycle-policy
- delete-lifecycle-policy
- メトリクスポリシー操作
- get-metric-policy
- put-metric-policy
- delete-metric-policy
- アクセスログ設定操作
- start-access-logging
- stop-access-logging
- タグ操作
- list-tags-for-resource
- tag-resource
- untag-resource
以降でそれぞれのコマンドについて詳細を確認していきたいと思います。なお、本エントリではmacOS Catalina上の以下環境で検証を行いました。(MediaStoreリリース時の検証から3年、当時はmac OS Sierra、aws-cli/1.14.17という環境でしたが、実行環境もバージョンアップしていますね。)
% aws --version aws-cli/2.2.14 Python/3.8.8 Darwin/19.6.0 exe/x86_64 prompt/off
CORSポリシー操作
まずはCORSポリシー設定についてのコマンドです。MediaStoreのドキュメント履歴、ならびに以下のAWS Developer Forumsの内容から2018年2月に機能アップデートがされていました。WebブラウザからJavaScript製の動画プレイヤーを利用してライブ動画再生を行うには必須の設定かと思いますが、リリース当時からMediaStoreに実装されていたわけではなく2、3ヶ月ほどの遅れがあったのですね。(CORS設定がない場合は、Lambda@Edgeでがんばる、などだったのかなぁ、などと想像しました。)
get-cors-policy
コンテナに設定されているCORSポリシーを取得するコマンドです。書式は以下の通り、コンテナ名を引数に取ります。
- aws mediastore get-cors-policy --container-name <value>
出力は以下のように、CORSポリシーとなるJSONが返ります。(--output
オプションで他形式にも変換可能なようですが、ユーザガイドの設定例などからもJSONでの確認が最も相性が良いのかと推測しています。)
% aws mediastore get-cors-policy --container-name mscli2021-container { "CorsPolicy": [ { "AllowedOrigins": [ "*" ], "AllowedMethods": [ "GET", "HEAD" ], "AllowedHeaders": [ "*" ], "MaxAgeSeconds": 3000 } ] }
またCORSポリシーが設定されていない状態では、下記のようにエラー(CorsPolicyNotFoundException
)が返りました。
% aws mediastore get-cors-policy --container-name mscli2021-container An error occurred (CorsPolicyNotFoundException) when calling the GetCorsPolicy operation:
put-cors-policy
コンテナにCORSポリシーを設定するコマンドです。書式は下記の通り、コンテナ名とポリシーを引数に取ります。ポリシーの内容はMediaStoreユーザガイドを参考にファイルにまとめ、file://
を使って指定してみました。
- aws mediastore put-cors-policy --container-name <value> --cors-policy <value>
% cat cors-policy.json [ { "AllowedHeaders": [ "*" ], "AllowedMethods": [ "GET", "HEAD" ], "AllowedOrigins": [ "*" ], "MaxAgeSeconds": 3000 } ]
実行時の出力は特にありません。実行後にget-cors-policyコマンドで設定されているCORSポリシーの内容を確認しておきましょう。
% aws mediastore get-cors-policy --container-name mscli2021-container An error occurred (CorsPolicyNotFoundException) when calling the GetCorsPolicy operation: % aws mediastore put-cors-policy --container-name mscli2021-container --cors-policy file://cors-policy.json % aws mediastore get-cors-policy --container-name mscli2021-container { "CorsPolicy": [ { "AllowedOrigins": [ "*" ], "AllowedMethods": [ "GET", "HEAD" ], "AllowedHeaders": [ "*" ], "MaxAgeSeconds": 3000 } ] }
CORSポリシーのアップデートにもput-cors-policyコマンドが利用できます。以下のAllowedOriginsを編集したCORSポリシーに更新するとします。
% cat cors-policy2.json [ { "AllowedHeaders": [ "*" ], "AllowedMethods": [ "GET", "HEAD" ], "AllowedOrigins": [ "https://www.example.com" ], "MaxAgeSeconds": 3000 } ]
ポリシーのアップデート(上書き)の際にも実行時の出力は特にありません。
% aws mediastore get-cors-policy --container-name mscli2021-container { "CorsPolicy": [ { "AllowedOrigins": [ "*" ], "AllowedMethods": [ "GET", "HEAD" ], "AllowedHeaders": [ "*" ], "MaxAgeSeconds": 3000 } ] } % aws mediastore put-cors-policy --container-name mscli2021-container --cors-policy file://cors-policy2.json % aws mediastore get-cors-policy --container-name mscli2021-container { "CorsPolicy": [ { "AllowedOrigins": [ "https://www.example.com" ], "AllowedMethods": [ "GET", "HEAD" ], "AllowedHeaders": [ "*" ], "MaxAgeSeconds": 3000 } ] }
delete-cors-policy
コンテナに設定されているCORSポリシーの削除を行うコマンドです。書式は以下の通り、コンテナ名を引数に取ります。
- aws mediastore delete-cors-policy --container-name <value>
put-cors-policyコマンドと同様、実行時の出力は特にないので、実行前後でget-cors-policyコマンドを実行し、設定されているCORSポリシーの内容を確認しておきましょう。CORSポリシーが削除されると、get-corps-policyコマンド実行時にはエラー(CorsPolicyNotFoundException
)が返ります。
% aws mediastore get-cors-policy --container-name mscli2021-container { "CorsPolicy": [ { "AllowedOrigins": [ "https://www.example.com" ], "AllowedMethods": [ "GET", "HEAD" ], "AllowedHeaders": [ "*" ], "MaxAgeSeconds": 3000 } ] } % aws mediastore delete-cors-policy --container-name mscli2021-container % aws mediastore get-cors-policy --container-name mscli2021-container An error occurred (CorsPolicyNotFoundException) when calling the GetCorsPolicy operation:
ライフサイクルポリシー操作
続いてライフサイクルポリシーについてのコマンドです。2018年12月のアップデートにより、MediaStoreのコンテナ内のオブジェクトについて、指定した日数の経過後に自動で削除されるライフサイクルポリシーが設定できるようになりました。
また2019年9月にはオブジェクト作成や更新から数秒単位で期限切れとなる一時データポリシー(Transient Dataポリシー)が利用できるようになり、また2020年4月には低頻度アクセスストレージ層(MediaStore-IA)の利用が可能になるアップデートがありました。
- AWS Elemental MediaStore Now Supports Stale Manifest Deletion
- AWS Elemental MediaStore adds lower cost infrequent access storage tier
これら2つの機能とあわせ、合計3つのオブジェクトのライフサイクル設定(一時データルール、オブジェクト削除ルール、ライフサイクル移行ルール)が可能です。
なお、2018年12月のライフサイクルポリシー機能リリース当時は、AWSマネジメントコンソールではライフサイクルポリシーの操作ができずAWS CLIやAWS SDKを利用する必要がありました。([アップデート] AWS Elemental MediaStoreでオブジェクト削除のライフサイクルポリシーが設定できるようになりました! | DevelopersIO)正確なアップデートタイミングは追えていませんが、2020年4月の段階にはマネジメントコンソールでのライフサイクルポリシーの編集ができるようになっていました。(AWS Elemental MediaStoreの一時データポリシーを使ってHLS配信時の冗長構成を確認してみた | DevelopersIO)
get-lifecycle-policy
コンテナに設定されているライフサイクルポリシーを取得するコマンドです。書式は以下の通り、コンテナ名を引数に取ります。
- aws mediastore get-lifecycle-policy --container-name <value>
実行すると以下のような結果が返ります。先ほどのget-cors-policyと異なり、JSONそのままの形式ではない点(\n
が入る形式ですね)に注意しましょう。
% aws mediastore get-lifecycle-policy --container-name mscli2021-container { "LifecyclePolicy": "{\n \"rules\": [\n {\n \"definition\": {\n \"path\": [\n {\"wildcard\": \"path/to/manifest/*.m3u8\"}\n ],\n \"seconds_since_create\": [\n {\"numeric\": [ \">\", 6 ]}\n ]\n },\n \"action\": \"EXPIRE\"\n }\n ]\n}\n" }
またCORSポリシーが設定されていない状態では、下記のようにエラー(PolicyNotFoundException
)が返りました。
% aws mediastore get-lifecycle-policy --container-name mscli2021-container An error occurred (PolicyNotFoundException) when calling the GetLifecyclePolicy operation: No policy found.
put-lifecycle-policy
コンテナにライフサイクルポリシーを設定するコマンドです。書式は下記のようにコンテナ名とライブサイクルポリシー内容を引数に取ります。例として(私の個人的に好きな機能)一時データ(Transient Data)ルールをMediaStoreユーザガイドを参考にファイルにまとめ、file://
を使って指定してみます。
- aws mediastore put-lifecycle-policy --container-name <value> --lifecycle-policy <value>
% cat lifecycle-policy-transient-data.json { "rules": [ { "definition": { "path": [ {"wildcard": "path/to/manifest/*.m3u8"} ], "seconds_since_create": [ {"numeric": [ ">", 6 ]} ] }, "action": "EXPIRE" } ] }
実行時の出力は特にありません。実行前後でget-lifecycle-policyコマンドで設定されているライフサイクルポリシーを確認しておきましょう。
% aws mediastore get-lifecycle-policy --container-name mscli2021-container An error occurred (PolicyNotFoundException) when calling the GetLifecyclePolicy operation: No policy found. % aws mediastore put-lifecycle-policy --container-name mscli2021-container --lifecycle-policy file://lifecycle-policy-transient-data.json % aws mediastore get-lifecycle-policy --container-name mscli2021-container { "LifecyclePolicy": "{\n \"rules\": [\n {\n \"definition\": {\n \"path\": [\n {\"wildcard\": \"path/to/manifest/*.m3u8\"}\n ],\n \"seconds_since_create\": [\n {\"numeric\": [ \">\", 6 ]}\n ]\n },\n \"action\": \"EXPIRE\"\n }\n ]\n}\n" }
delete-lifecycle-policy
コンテナに設定されているライフサイクルポリシーを削除するコマンドエス。書式は以下の通り、コンテナ名を引数に取ります。
- aws mediastore delete-lifecycle-policy --container-name <value>
こちらもput-lifecycle-policyコマンドと同様、実行時の出力は特にありません。必要に応じて、実行前後でget-lifecycle-policyコマンドを用いて設定されているライフサイクルポリシーを確認するようにしましょう。
% aws mediastore get-lifecycle-policy --container-name mscli2021-container { "LifecyclePolicy": "{\n \"rules\": [\n {\n \"definition\": {\n \"path\": [\n {\"wildcard\": \"path/to/manifest/*.m3u8\"}\n ],\n \"seconds_since_create\": [\n {\"numeric\": [ \">\", 6 ]}\n ]\n },\n \"action\": \"EXPIRE\"\n }\n ]\n}\n" } % aws mediastore delete-lifecycle-policy --container-name mscli2021-container % aws mediastore get-lifecycle-policy --container-name mscli2021-container An error occurred (PolicyNotFoundException) when calling the GetLifecyclePolicy operation: No policy found.
メトリクスポリシー操作
メトリクスポリシーについてのコマンドです。MediaStoreでは2020年3月にCloudWatchメトリクスのサポートが開始されました。リクエスト数やエラーレートなどがCloudWatch側で監視できるようになり、アラームなどとも連携が可能です。メトリクスはコンテナレベルで設定するほか、オブジェクトやパスレベルでも設定が可能です。この設定はCORSやライフサイクルと同じようにコンテナに設定するポリシー(メトリクスポリシー)で行います。
get-metric-policy
コンテナに設定されているメトリクスポリシーを取得するコマンドです。書式は以下の通り、コンテナ名を引数に取ります。
- aws mediastore get-metric-policy --container-name <value>
実行すると以下のように、メトリクスポリシーとなるJSONが返ります。
% aws mediastore get-metric-policy --container-name mscli2021-container { "MetricPolicy": { "ContainerLevelMetrics": "ENABLED", "MetricPolicyRules": [ { "ObjectGroup": "path/to/folder", "ObjectGroupName": "MSObjectGroup" } ] } }
またコンテナにメトリクスポリシーが設定されていな状態では、以下のようにエラー()が返りました。
% aws mediastore get-metric-policy --container-name mscli2021-container An error occurred (PolicyNotFoundException) when calling the GetMetricPolicy operation:
put-metric-policy
コンテナにメトリクスポリシーを設定するコマンドです。書式は以下の通り、コンテナ名とメトリクスポリシー内容を引数に取ります。ポリシー内容はMediaStoreユーザガイドを参考に、コンテナレベルとパスレベルの両方でメトリクスを設定してみました。ファイルにまとめてfile://
を使って指定します。
- aws mediastore put-metric-policy --container-name <value> --metric-policy <value>
% cat metric-policy.json { "ContainerLevelMetrics": "ENABLED", "MetricPolicyRules": [ { "ObjectGroup": "path/to/folder", "ObjectGroupName": "MSObjectGroup" } ] }
ほかのポリシー設定用コマンドと同様、こちらも実行時の出力は特にありません。必要に応じて実行前後でget-metric-policyコマンドを使い設定内容を確認しておきます。
% aws mediastore get-metric-policy --container-name mscli2021-container An error occurred (PolicyNotFoundException) when calling the GetMetricPolicy operation: % aws mediastore put-metric-policy --container-name mscli2021-container --metric-policy file://metric-policy.json % aws mediastore get-metric-policy --container-name mscli2021-container { "MetricPolicy": { "ContainerLevelMetrics": "ENABLED", "MetricPolicyRules": [ { "ObjectGroup": "path/to/folder", "ObjectGroupName": "MSObjectGroup" } ] } }
delete-metric-policy
コンテナに設定されているメトリクスポリシーを削除するコマンドです。書式は以下の通り、コンテナ名を引数に取ります。
- aws mediastore delete-metric-policy --container-name <value>
こちらも他のポリシー削除用コマンドと同様、実行時の出力は特にありません。
% aws mediastore get-metric-policy --container-name mscli2021-container { "MetricPolicy": { "ContainerLevelMetrics": "ENABLED", "MetricPolicyRules": [ { "ObjectGroup": "path/to/folder", "ObjectGroupName": "MSObjectGroup" } ] } } % aws mediastore delete-metric-policy --container-name mscli2021-container % aws mediastore get-metric-policy --container-name mscli2021-container An error occurred (PolicyNotFoundException) when calling the GetMetricPolicy operation:
アクセスログ設定
アクセスログ設定用のコマンドです。MediaStoreでは2019年2月にアクセスログの出力がサポートされました。
こちらも機能リリース当時はAWSマネジメントコンソールでアクセスログ設定の操作が行えず、AWS CLIやAWS SDKを利用する必要がありました。またアクセスログはCloudWatch Logsに出力されます。そのためMediaStoreからCloudWatchへのアクセスを許可するIAMロールが必要です。([アップデート] AWS Elemental MediaStoreがアクセスログをサポートしました! | DevelopersIO)
アクセスログについてはポリシーで設定するのではなく、有効/無効の状態を変更するかたちとなります。アクセスログの有効状態の確認はdescribe-containerコマンドのAccessLoggingEnabled
を参照します。
start-access-logging
コンテナのアクセスログを有効にするコマンドです。書式は以下の通り、コンテナ名を引数に取ります。
- aws mediastore start-access-logging --container-name <value>
実行時の出力は特にありません。start-access-loggingコマンド実施の前後でdescribe-containerコマンドを実行しAccessLoggingEnabled
を確認、設定状態をチェックしておきましょう。
% aws mediastore describe-container --container-name mscli2021-container { "Container": { "Endpoint": "https://sm7qxxxxxxxxxx.data.mediastore.ap-northeast-1.amazonaws.com", "CreationTime": "2021-06-28T19:49:38+09:00", "ARN": "arn:aws:mediastore:ap-northeast-1:123456789012:container/mscli2021-container", "Name": "mscli2021-container", "Status": "ACTIVE", "AccessLoggingEnabled": false } } % aws mediastore start-access-logging --container-name mscli2021-container % aws mediastore describe-container --container-name mscli2021-container { "Container": { "Endpoint": "https://sm7qxxxxxxxxxx.data.mediastore.ap-northeast-1.amazonaws.com", "CreationTime": "2021-06-28T19:49:38+09:00", "ARN": "arn:aws:mediastore:ap-northeast-1:123456789012:container/mscli2021-container", "Name": "mscli2021-container", "Status": "ACTIVE", "AccessLoggingEnabled": true } }
stop-access-logging
コンテナのアクセスログを無効にするコマンドです。書式は以下の通り、コンテナ名を引数に取ります。
- aws mediastore stop-access-logging --container-name <value>
start-access-loggingコマンドと同様、実行時の出力は特にありません。
% aws mediastore describe-container --container-name mscli2021-container { "Container": { "Endpoint": "https://sm7qxxxxxxxxxx.data.mediastore.ap-northeast-1.amazonaws.com", "CreationTime": "2021-06-28T19:49:38+09:00", "ARN": "arn:aws:mediastore:ap-northeast-1:123456789012:container/mscli2021-container", "Name": "mscli2021-container", "Status": "ACTIVE", "AccessLoggingEnabled": true } } % aws mediastore stop-access-logging --container-name mscli2021-container % aws mediastore describe-container --container-name mscli2021-container { "Container": { "Endpoint": "https://sm7qxxxxxxxxxx.data.mediastore.ap-northeast-1.amazonaws.com", "CreationTime": "2021-06-28T19:49:38+09:00", "ARN": "arn:aws:mediastore:ap-northeast-1:123456789012:container/mscli2021-container", "Name": "mscli2021-container", "Status": "ACTIVE", "AccessLoggingEnabled": false } }
タグ操作
コンテナへ設定するタグ操作用のコマンドです。MediaStoreでは現時点(2021/06/28)でコンテナリソースに対してのタギングがサポートされています。(オブジェクトに対して未サポートです。)コンテナへのタギングは2019年6月のアップデートでサポートされました。また2020年11月にはタグベースのアクセスコントロールのサポートも発表されています。
タグ操作については現時点で(2021/06/28)でも、AWSマネジメントコントロールでの操作は未対応で、AWS CLIやAWS SDKを用いて操作(参照、設定、削除)する必要があります。(AWS Elemental MediaStoreでタグベースのアクセスコントロールを試してみた | DevelopersIO)
list-tags-for-resource
タグ情報を参照するコマンドです。describe-containerコマンドで得られる情報にははコンテナに設定されているタグ情報は含まれず、こちらを使用する必要があります。
書式は以下の通りで、引数としてコンテナのARNを渡します。ほかのコマンドと異なり、コンテナ名ではない点に注意しましょう。
- aws mediastore list-tag-for-resource --resource <value>
% aws mediastore list-tags-for-resource --resource arn:aws:mediastore:ap-northeast-1:123456789012:container/mscli2021-container { "Tags": [ { "Key": "key1", "Value": "value1" }, { "Key": "key2", "Value": "value2" } ] }
タグが存在しない状態でも、エラーではなくからの情報を返します。
% aws mediastore list-tags-for-resource --resource arn:aws:mediastore:ap-northeast-1:123456789012:container/mscli2021-container { "Tags": [] }
tag-resource
タグ情報を設定するコマンドです。list-tags-for-resourceコマンドと同様、引数としてコンテナ名ではなくコンテナのARNを、またあわせてタグ情報をコマンド実行時に引数として渡します。
- aws mediastore tag-resource --resource <value> --tags <value>
タグ情報は以下のフォーマットで指定します。
'[{"Key": "key1", "Value": "value1"}, {"Key": "key2", "Value": "value2"}]'
実行時の出力は特にありません。
% aws mediastore list-tags-for-resource --resource arn:aws:mediastore:ap-northeast-1:123456789012:container/mscli2021-container { "Tags": [] } % aws mediastore tag-resource --resource arn:aws:mediastore:ap-northeast-1:123456789012:container/mscli2021-container --tags '[{"Key": "key1", "Value": "value1"}, {"Key": "key2", "Value": "value2"}]' % aws mediastore list-tags-for-resource --resource arn:aws:mediastore:ap-northeast-1:123456789012:container/mscli2021-container { "Tags": [ { "Key": "key1", "Value": "value1" }, { "Key": "key2", "Value": "value2" } ] }
untag-resource
タグ情報を削除するコマンドです。削除の際には引数として削除するタグのKeyを渡します。またコンテナの指定はほかのタグ操作コマンドと同様ARNで行います。
- aws mediastore untag-resource --resource <value> --tag-keys <value>
実行時の出力はこちらのコマンドでもありませんので、list-tags-for-resourceコマンドで状態の変更を確認しておきましょう。
% aws mediastore list-tags-for-resource --resource arn:aws:mediastore:ap-northeast-1:123456789012:container/mscli2021-container { "Tags": [ { "Key": "key1", "Value": "value1" }, { "Key": "key2", "Value": "value2" } ] } % aws mediastore untag-resource --resource arn:aws:mediastore:ap-northeast-1:123456789012:container/mscli2021-container --tag-keys key1 % aws mediastore list-tags-for-resource --resource arn:aws:mediastore:ap-northeast-1:123456789012:container/mscli2021-container { "Tags": [ { "Key": "key2", "Value": "value2" } ] }
まとめ
AWS Elemental MediaStoreのAWS CLIでの操作について、3年前に公開したContainer操作系コマンド編、Object操作系コマンド編の2本に続く第3弾「リリース後に追加されたContainer操作系コマンド編」をまとめてみました。Container操作系コマンドはMediaStoreサービスリリース時は7個でしたが、14個増えて合計21個となっていました。AWSサービスは機能アップデートが多いとはわかっていても、ここまでコマンド(API)の数が増えているとは思っていなかったので、まとめてみて正直驚いています。そして2018年1月にに第1弾、第2弾をまとめた自分も、まさかこの続編を書くとは思っていなかったでしょう。
ただコマンドの数が増えているとはいえ、非常にシンプルにまとまっているという印象です。コンテナに対して機能を設定するためのポリシーがあり、そのポリシーについては、get/put/deleteそれぞれの操作がある、というのが基本のパターンかと思います。(もちろん、これから外れるものもありますが。)今後どのようにサービスとしての機能、そしてAPI(とコマンド)が増えていくかも興味深いところだなと思いました。